#ifndef SINGLETON_H
#define SINGLETON_H
#include <global.h>
using namespace std;

// 单例模板类
template <typename T>
class Singleton
{
protected:
    // 保护构造函数，防止外部实例化
    Singleton() = default;

    // 删除拷贝构造函数，防止通过拷贝创建新实例
    Singleton(const Singleton<T>&) = delete;

    // 删除赋值运算符，防止通过赋值创建新实例
    Singleton& operator=(const Singleton<T>& st) = delete;

    // 静态成员变量，存储单例实例的智能指针
    static std::shared_ptr<T> _instance;

public:
    // 获取单例实例的静态方法
    static std::shared_ptr<T> GetInstance()
    {
        // once_flag 保证 call_once 只执行一次
        static std::once_flag s_flag;

        // 使用 call_once 确保线程安全地初始化单例
        std::call_once(s_flag, [&]()
        {
            _instance = shared_ptr<T>(new T);  // 创建实例并用智能指针管理
        });

        return _instance;  // 返回单例实例
    }

    // 打印实例地址的方法，用于调试
    void PrintAddress()
    {
        std::cout << _instance.get() << endl;
    }

    // 析构函数，输出调试信息
    ~Singleton()
    {
        std::cout << "this is singleton destruct" << std::endl;
    }
};

// 静态成员变量初始化
template <typename T>
std::shared_ptr<T> Singleton<T>::_instance = nullptr;





#endif // SINGLETON_H
